//
// Created by 张朝辉 on 23-9-13.
//

#ifndef LEARN1_DFA_H
#define LEARN1_DFA_H

#include<set>
#include<map>
#include<utility>
#include<string>

// typedef char (*func_ex_state_transition)(char now_state,std::string w);

class DFA {
private:
    std::set<std::string> state_set;       // 状态集
    std::set<char> char_set;        // 输入符号集合
    std::string start_state;               // 初始状态
    std::set<std::string> final_set;       // 结束状态集
    std::map<std::pair<std::string,char>,std::string> rule_table;   // 状态转换表

    /*
     * 状态转换函数
     * now_state: 当前状态，now_char: 接收符号
     */
    auto state_transition(std::string now_state,char now_char) -> std::string;

    /*
     * 扩展状态转换函数，返回的结果DFA为识别完整个串后最终的状态
     * now_state: 当前的状态，w: 接收的串
     */
    auto extend_state_transition(std::string now_state,std::string w) -> std::string;

    /*
     * 获取当前状态经过一次状态转换能达到的所有状态的集合
     */
    auto getNextStateSet(std::string nowState) -> std::set<std::string>;

    /*
     * 使用递归方式将DFA转换为正则表达式需要对状态进行重新编号
     */
    auto resetRuleTable() -> void;

    /*
     * 状态i在不经过中间状态的情况下能否转换为状态j，返回状态i到状态j所识别的正则表达式
     */
    auto regexZero(int i,int j) -> std::string;

    /*
     * 递归构造正则表达式的函数
     */
    auto Regex(int i,int j,int k) -> std::string;
public:
    // 构造函数，初始化状态转换表
    DFA(std::set<std::string> state_set,std::set<char> char_set,std::string start_state,std::set<std::string> final_set,std::map<std::pair<std::string,char>,std::string> rule_table);

    /*
     * 判断某个字符串能否被此DFA正确识别
     */
    auto isAccept_str(std::string str)-> bool;

    /*
     * 将一个DFA转换为正则表达式
     */
    auto DFA2Regex() ->std::string;

    /*
     * 打印DFA的相关信息
     */
    auto description() -> void;

};

#endif //LEARN1_DFA_H
